#ifndef NUMBER_H_
#define NUMBER_H_


#include "Fraction.h"

namespace SymCe{
	class Number{
	private:
		typedef long double Real;
		enum NumberType{FRACTION, REAL} type;
		Fraction fraction;
		Real real;
	public:
		Number();
		Number(const Number & number);
		Number(const Fraction & fraction);
		Number(int i_);	//Is it enough? What about other types of integers?
		Number(long double d_);
		Number(double d_);
		//More?
		//Destructor
		~Number();
		//Operators
		//Unary:
		Number operator+(void) const;
		Number operator-(void) const;
		//Binary:
		Number operator+(const Number &) const;
		Number operator-(const Number &) const;
		Number operator*(const Number &) const;
		Number operator/(const Number &) const;
		Number operator^(const Number & num);  //it is useful
		Number & operator=(const Number &);	//TODO: Other assignments?
		//Comparison:
		bool operator<(const Number &) const;
		bool operator>(const Number &) const;
		bool operator<=(const Number &) const;
		bool operator>=(const Number &) const;
		bool operator==(const Number &) const;
		bool operator!=(const Number &) const;

		//Getting the values of data.
		long double get_double() const;
		//operator long double();
		bool is_int() const;
		bool is_int();
		friend std::ostream & operator<<(std::ostream & s, const Number & number);

	};

	std::ostream & operator<<(std::ostream & s, const Number & number);

}


#endif /*NUMBER_H_*/
